/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.swt;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;

import de.mnit.basis.daten.struktur.container.Engpass;
import de.mnit.basis.daten.struktur.gruppe.Gruppe2;
import de.mnit.basis.daten.typ.zeit.S_Datum;
import de.mnit.basis.fehler.system.F_Sys_Sicherheit;
import de.mnit.basis.swt.anw.A_MN_Gruppe;
import de.mnit.basis.swt.dialog.SWT_Dialog;
import de.mnit.basis.swt.dialog.SWT_Fehler;
import de.mnit.basis.swt.dialog.SWT_Meldung;
import de.mnit.basis.swt.element.S_SWT_Komponente;
import de.mnit.basis.swt.element.feld.werkzeug.knopf.SWT_WerkzeugTaster;
import de.mnit.basis.swt.element.steuer.rollbar.SWT_TextEingabe;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.SWT_WerkzeugLeiste;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.SWT_TextEditor;
import de.mnit.basis.swt.konstant.SWT_SCHRIFT;
import de.mnit.basis.swt.layout.LayoutAbsolut;
import de.mnit.basis.sys.event.S_Zuhoerer;
import de.mnit.basis.sys.sprache.S;
import de.mnit.schnipsel.db.B_Schnipsel;
import de.mnit.schnipsel.db.CRYPTLEVEL;
import de.mnit.schnipsel.db.DBManager;
import de.mnit.schnipsel.swt.editor.TextEditorGui;
import de.mnit.schnipsel.zentral.SC_Bilder;
import de.mnit.schnipsel.zentral.SC_Events;
import de.mnit.schnipsel.zentral.SC_GuiObs;
import de.mnit.schnipsel.zentral.SC_Zurueck;


/**
 * @author Michael Nitsche
 */
public class K_Anzeige extends A_MN_Gruppe<K_Anzeige> {

	public static void main(String[] args)   { start(K_Anzeige.class,600,400); }

	private static final S s=new S(K_Anzeige.class);

	private static final int[] farbe_neu=new int[]{255,255,191}; //255,255,149
	private static final int[] farbe_aen=new int[]{223,223,255}; //200,200,255
	private static final int[] farbe_std=new int[]{255,255,255};

	private final TextEditorGui			k_edit		= new TextEditorGui();
	private final SWT_TextEingabe		k_titel  	= new SWT_TextEingabe();
	private final SWT_WerkzeugLeiste 	k_leiste	= new SWT_WerkzeugLeiste().s1_Flach();
	private Integer        	aktuelle_id	= null;
	private boolean        	geaendert	= false;
	private S_Datum			ablauf		= null;


	public void sAblauf(S_Datum ablauf) {
		this.ablauf=ablauf;
	}

	public S_Datum gAblauf() {
		return this.ablauf;
	}

	public SWT_TextEditor gEditor() {
		return t.k_edit.gEditor();
	}

	public Integer gID() {
		return this.aktuelle_id;
	}

	public void sGeaendert(boolean status) {
		this.geaendert=status;
		iTitelfarbe();
	}

	public boolean istNeuGeaendert() {
		return this.aktuelle_id==null && this.geaendert;
	}

	public void eGeaendert(S_Zuhoerer<?> z) {
		t.zuhoererPlus("AENDERUNG", z);
	}

	public void sID(Integer id) {
		// Ausgabe.debugDetail(id);
		final Engpass<Boolean> weiter=Engpass.neu(true);

		if(this.geaendert) {
			SWT_Meldung m=SWT_Meldung.neu(s.t("Eintrag wurde geändert! Jetzt speichern?"));
			m.sTyp_Warnung();
			m.sKnopf_Ja(new Listener(){
				public void handleEvent(Event event) {
					weiter.s(speichern());
				}
			});
			m.sKnopf_Nein(new Listener(){
				public void handleEvent(Event event) {
				}
			});
			m.oeffnen();
		}

		if(!weiter.g())
			return;

		if(id!=null) {
			try {
				iLade(id);
			}
			catch(F_Sys_Sicherheit e) {
				SWT_Fehler.neu(s.t("Eintrag konnte nicht geladen werden!"), false);
				return;
			}
			SC_Zurueck.i().plus();
		}
		else {
			this.aktuelle_id=null;
			this.k_edit.sLeer();
			t.k_titel.sText("");
			this.ablauf=null;
			CRYPTLEVEL cryptlvl=DBManager.konfig().gCryptLevel();
			B_Schnipsel s=new B_Schnipsel();
			s.CRYPT_INHALT.s(cryptlvl.inhalt);
			this.k_edit.setze(s);
		}
		geaendert=false;
		iTitelfarbe();
	}

	public boolean speichern() {
		if(this.k_titel.gText().length()==0) {
			SWT_Dialog.hinweis(s.t("Bitte dem Eintrag einen Titel geben!"));
			return false;
		}
		try {
			iSpeichern();
			iLade(this.aktuelle_id);
		}
		catch(F_Sys_Sicherheit e) {
//			Fehler.zeig(e);
			SWT_Fehler.neu(s.t("Eintrag konnte leider nicht gespeichert werden!"), false);
//			SWT_Dialog.hinweis(s.t("Beim Speichern ist ein Fehler aufgetreten!"));
			return false;
		}
		iTitelfarbe();
		t.zuhoererStart("AENDERUNG", null);
		return true;
	}

	public void speichernEnde() {
		if(!this.geaendert)
			return;
		Boolean speichern=SWT_Dialog.frage_JaNein(s.t("Eintrag speichern?"));
		if(speichern==null || !speichern)
			return;
		try {
			iSpeichern();
		}
		catch(F_Sys_Sicherheit e) {
			SWT_Fehler.neu(s.t("Eintrag konnte leider nicht gespeichert werden!"), false);
		}
	}

	// ERZEUGEN

	protected S_SWT_Komponente<?, ? extends Composite> layout() {
		return LayoutAbsolut.neu()
			.sKomponente(t.k_leiste).sLORU(0, 0, null, null).sBH(24+2*9, 24+2*5).fertig()  //7,6 wurde bei Arne nicht angezeigt!
			.sKomponente(t.k_titel).sLORU(t.k_leiste, 5, 0, null).fertig() //50
			.sKomponente(t.k_edit).sLORU(0, 35, 0, 0).fertig() //u25
		;
	}

	protected void initStyle() {
		iTitelfarbe();
		t.k_edit.sSchrift(SWT_SCHRIFT.MONOSPACE, 10);
		t.k_edit.sWordWrap();
		t.k_titel.sTip(s.t("Titel"));
	}

	protected void initEvents() {
		SWT_WerkzeugTaster tx=t.k_leiste.nFeldBild(SC_Bilder.gIcon_24_Plus.gIcon(), s.t("Neuen Eintrag"));
		tx.eAuswahl(new Listener() {
			public void handleEvent(Event event) {
				SC_Events.schnipselPlus();
			}
		});
		t.k_edit.eGeaendert(new S_Zuhoerer<Object>(){
			public void verarbeite(Object o) {
				geaendert=true;
				iTitelfarbe();
			}
		});

		t.k_titel.eAenderung(new Listener(){
			public void handleEvent(Event event) {
				geaendert=true;
				iTitelfarbe();
			}
		});
	}

	// INTERN

	private void iSpeichern() throws F_Sys_Sicherheit {
		Integer baum=SC_GuiObs.i().baum().gAuswahlID();
		if(baum!=null && baum<0)
			baum=null;

		CRYPTLEVEL geschuetzt=this.k_edit.gGeschuetzt();
		if(baum!=null) {
			boolean cryptOrdner=DBManager.baum().gGeschuetzt(baum);
			if(cryptOrdner)
				geschuetzt=CRYPTLEVEL.INHALT;
		}

		Gruppe2<String,String> tf=t.k_edit.gTextUndFormat();
		boolean neu=this.aktuelle_id==null;
		if(!neu)
			DBManager.schnipsel().aendern(this.aktuelle_id, t.k_titel.gText(), tf.g1(), tf.g2(), geschuetzt, true);
		else
			this.aktuelle_id=DBManager.schnipsel().plus(t.k_titel.gText(), tf.g1(), tf.g2(), geschuetzt);
		if(neu && baum!=null)
			DBManager.schnipsel().sBaumZweig(this.aktuelle_id, baum, false);
		DBManager.schnipsel().sAblauf(this.aktuelle_id, this.ablauf);
		geaendert=false;
	}

	private void iLade(int id) throws F_Sys_Sicherheit {
		B_Schnipsel s=DBManager.schnipsel().gEintragB(id);
		this.k_titel.sText(s.TITEL.g());
		this.ablauf=s.ABLAUF.g();
		this.k_edit.setze(s);
		this.geaendert=false;
		this.aktuelle_id=id;
	}

	private void iTitelfarbe() {
		boolean neu = this.aktuelle_id==null;
		boolean aen = this.geaendert;

		int[] rgb=null;
		if(neu)		 rgb=farbe_neu;
		else if(aen) rgb=farbe_aen;
		else		 rgb=farbe_std;

		t.k_titel.sHintergrund(rgb[0], rgb[1], rgb[2]);
		t.k_edit.sSpeichern(neu || aen);
	}

}
